home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 41 / Amiga Format CD41 (1999-06)(Future Publishing)(GB)[!][issue 1999-07].iso / -seriously_amiga- / cd-rom / acdb / src / acdb_arexx.e < prev    next >
Text File  |  1999-04-28  |  5KB  |  194 lines

  1. OPT MODULE,OSVERSION=37
  2. OPT PREPROCESS,REG=5
  3.  
  4.  
  5. /*
  6.  *-- AutoRev header do NOT edit!!
  7.  *
  8.  *   Project         :   AMIGA CD BASE - program obsîugujâcy CDDB
  9.  *   File            :   acdb_arexx.e
  10.  *   Description     :   procedury obsîugujâce port arexxa programu
  11.  *   Copyright       :   ©1997-1999 Piotr Gapiïski
  12.  *   Author          :   Piotr Gapiïski
  13.  *   Creation Date   :   10.03.99
  14.  *   Current version :   1.0
  15.  *   Translator      :   AmigaE v3.3a
  16.  *
  17.  *   REVISION HISTORY
  18.  *
  19.  *   1.0 (10.03.99)
  20.  *    o   moduî nie powoduje kîopotów w przypadku braku biblioteki easyrexx
  21.  *        gdy biblioteka nie jest zainicjalizowana arxSigs() zwraca 0, a
  22.  *        arxPortName() zwraca 'N/A'
  23.  *
  24.  *   0.6 (06.10.98)
  25.  *    o   wykorzystuje bibliotekë easyrexx, która MUSI byê wczeôniej otwarta
  26.  *    o   procedury obsîugujâce rozkazy arexx'a sâ wywoîywane w konwencji
  27.  *        rc:=proc(arxArgs,userdata)
  28.  *        gdzie userdata jest dowolnie definiowalna (podczas arxHandle), procedura
  29.  *        powinna zwróciê FALSE gdy wymagany jest koniec programu, inne dane do
  30.  *        przekazywania z procedury naleûy umieszczaê w arxArgs
  31.  *    o   arxSend domyôlnie wysyîa dane do portu interpretera arexx'a traktujâc je
  32.  *        jako nazwy plików do wykoania
  33.  *
  34.  *-- REV_END --*
  35.  */
  36.  
  37.  
  38. MODULE 'easyrexx','libraries/easyrexx','libraries/easyrexx_macros'
  39. MODULE 'rexx/errors'
  40. MODULE 'utility/tagitem','exec/ports','exec/lists','intuition/intuition'
  41. MODULE '*acdb_debug'
  42.  
  43.  
  44.  
  45.   #ifdef DEBUG
  46.     MODULE 'tools/debug'
  47.     #define D(a,b) kputfmt(a,b)
  48.   #endif
  49.   #ifndef DEBUG
  50.     #define D(a,b)
  51.   #endif
  52.  
  53.   EXPORT DEF prg_name:PTR TO CHAR, prg_vers:PTR TO CHAR, prg_copy:PTR TO CHAR
  54.  
  55.   EXPORT OBJECT arxArgs
  56.     argv      :PTR TO LONG        ->- tablica parametrów komendy
  57.     rc        :LONG               ->- kod bîëdu
  58.     rclong    :LONG               ->- rezultat (long)
  59.     rcstring  :PTR TO CHAR        ->- rezultat (string)
  60.     err       :PTR TO CHAR        ->- opis bîëdu (dostëpny via GET LASTERROR)
  61.   ENDOBJECT
  62.  
  63.   CONST MAXLONG = 2147483647
  64.   DEF arctx:PTR TO arexxcontext, cmd:PTR TO arexxcommandtable
  65.  
  66.  
  67.  
  68. EXPORT PROC arxSetup(cmdtable=NIL)
  69.  
  70.   ->-
  71.   ->- inicjalizacja portu arexx'a programu
  72.   ->- jeûeli biblioteka (easyrexx) nie bëdzie otwarta to port arexx'a nie zostanie
  73.   ->- zainicjalizowany
  74.   ->-
  75.  
  76.   IF (easyrexxbase = NIL) THEN RETURN NIL
  77.   cmd := cmdtable
  78.   arctx := AllocARexxContextA(
  79.     [
  80.       ER_Portname,      prg_name,
  81.       ER_CommandTable,  cmdtable,
  82.       ER_Author,        prg_copy,
  83.       ER_Copyright,     prg_copy,
  84.       ER_Version,       prg_vers + 6,
  85.       TAG_DONE
  86.     ])
  87. ENDPROC arctx
  88.  
  89.  
  90.  
  91. EXPORT PROC arxCleanUp()
  92.  
  93.   ->-
  94.   ->- zwalnianie pamiëci zajmowanej przez port arexx'a
  95.   ->-
  96.  
  97.   IF (arctx) THEN FreeARexxContext(arctx)
  98.   arctx := NIL
  99. ENDPROC
  100.  
  101.  
  102.  
  103. EXPORT PROC arxSigs()
  104.   DEF rc=0
  105.  
  106.   IF (arctx)
  107.     ER_SETSIGNALS(arctx, ER_SIGNAL(arctx))
  108.     rc := ER_SIGNALS(arctx)
  109.   ENDIF
  110. ENDPROC rc
  111. EXPORT PROC arxPortName() IS IF (arctx) THEN arctx.portname ELSE 'N/A'
  112.  
  113.  
  114.  
  115. EXPORT PROC arxHandle(userdata=NIL)
  116.  
  117.   ->-
  118.   ->- procedura obsîugujâca sygnaîy napîywajâce do portu arexx'a
  119.   ->- funkcje obsîugujâce poszczególne komendy arexx'a sâ wywoîywane w konwencji
  120.   ->- rc := func(args:PTR TO arxArgs, userdata)
  121.   ->- gdy rc=FALSE to nastëpuje zakoïczenie dziaîania funkcji
  122.   ->-
  123.  
  124.   DEF id, running, func, i, args:arxArgs
  125.  
  126.   IF (cmd = NIL) THEN RETURN TRUE
  127.   running := TRUE
  128.   WHILE GetARexxMsg(arctx)
  129.  
  130.     id := arctx.id
  131.  
  132.     ->-
  133.     ->- zainicjuj strukturë przekazywanâ do wywoîywanej funkcji
  134.     ->-
  135.  
  136.     args.argv     := arctx.argv
  137.     args.rc       := RC_OK
  138.     args.rclong   := MAXLONG
  139.     args.rcstring := NIL
  140.     args.err      := NIL
  141.  
  142.     ->-
  143.     ->- odszukaj odpowieni rozkaz i wywoîaj go
  144.     ->-
  145.  
  146.     i := 0
  147.     WHILE (func := cmd[i].userdata)
  148.       IF (cmd[i].id = id) THEN running := func(args, userdata)
  149.       EXIT (cmd[i].id = id)
  150.       INC i
  151.     ENDWHILE
  152.  
  153.     ReplyARexxMsgA(arctx,
  154.       [
  155.         ER_ReturnCode, args.rc,
  156.         IF (args.rcstring) THEN ER_ResultString ELSE TAG_IGNORE, args.rcstring,
  157.         IF (args.rclong <> MAXLONG) THEN ER_ResultLong ELSE TAG_IGNORE, args.rclong,
  158.         IF (args.err) THEN ER_ErrorMessage ELSE TAG_IGNORE, args.err,
  159.  
  160.         ->-
  161.         ->- jeûeli zostanie to odblokowane to komenda arexx'a GET LASTERROR bëdzie
  162.         ->- zwraca kod bîëdu ostatniej instrukcji a nie ostatni bîâd
  163.         ->-
  164.         ->- ER_ErrorMessage, args.err,
  165.         ->-
  166.  
  167.         TAG_DONE
  168.       ])
  169.     EXIT (running = FALSE)
  170.   ENDWHILE
  171. ENDPROC running
  172.  
  173.  
  174.  
  175. EXPORT PROC arxSend(cmd, portname=NIL:PTR TO CHAR, file=TRUE)
  176.  
  177.   ->-
  178.   ->- procedura wysyîajâca do portu arexx'a (portname) komendë (cmd)
  179.   ->- komenda moûna okreôlaê skrypt arexx'a, który ma byê uruchomiony (file = TRUE)
  180.   ->- przesyîanie jesy SYNCHRONICZNE
  181.   ->-
  182.  
  183.   DEF rc
  184.  
  185.   rc:=SendARexxCommandA(cmd,
  186.     [
  187.       ER_Asynch, 0,
  188.       IF (portname) THEN ER_Portname ELSE TAG_IGNORE, portname,
  189.       ER_Context, arctx,
  190.       IF (file) THEN ER_File ELSE ER_String, 1,
  191.       TAG_DONE
  192.     ])
  193. ENDPROC rc
  194.